//
// test.go
// Copyright (C) 2019 crane <crane@his-pc>
//
// Distributed under terms of the MIT license.
//

package main

import (
	"fmt"
)

/**
 * @param matrix: a lists of integers
 * @return: nothing
 */
func rotate(matrix *[][]int) {
	rowLen := len(*matrix)

	get_invert_idx := func(idx int) int {
		return rowLen - 1 - idx
	}

	for circle_idx := 0; rowLen-circle_idx*2 > 1; circle_idx += 1 {
		// circle_idx 当前最外一圈: 由外向内一圈一圈的处理
		// fmt.Println(circle_idx)

		for start_col_idx := circle_idx; start_col_idx < get_invert_idx(circle_idx); start_col_idx += 1 {
			// 注意后面会修改cur_row, 所以每次要重新赋值
			cur_row, cur_col := circle_idx, start_col_idx
			tmp := (*matrix)[cur_row][cur_col]

			// 4个点为一个group
			for i := 0; i < 3; i++ {
				// 这里简单来说: 就是对当前(x, y) 做一个(仿射)线性变化, 然后得到之前的(x, y), 或者之后的(x, y)
				pre_col, pre_row := cur_row, get_invert_idx(cur_col)

				(*matrix)[cur_row][cur_col] = (*matrix)[pre_row][pre_col]

				cur_row, cur_col = pre_row, pre_col
			}

			// 赋值tmp给最后: 第4次
			// fmt.Println("cur_pos", cur_row, cur_col)
			(*matrix)[cur_row][cur_col] = tmp

			// fmt.Println()
		}

	}

}

// [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
// Output
// [[13,9,5,1],[14,6,7,2],[15,10,11,3],[16,12,8,4]]
// Expected
// [[13,9,5,1],[14,10,6,2],[15,11,7,3],[16,12,8,4]]
func main() {
	fmt.Println("start main")
	r0 := []int{1, 2, 3, 4}
	r1 := []int{5, 6, 7, 8}
	r2 := []int{9, 10, 11, 12}
	r3 := []int{13, 14, 15, 16}

	m := [][]int{r0, r1, r2, r3}

	rotate(&m)
	for i := 0; i < len(m); i++ {
		for col := 0; col < len(m); col++ {
			fmt.Print(m[i][col], ",")
		}
		fmt.Println()
	}
}
